package com.sinosoft.cnmuseum.servlets;

import java.util.HashMap;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

import com.sinosoft.cnmuseum.dao.MbXtglYhxxDao;
import com.sinosoft.cnmuseum.entity.MbXtglYhxx;
import com.sinosoft.cnmuseum.servlets.i.IServlet;
import com.sinosoft.cnmuseum.utils.PageUtil;
import com.sinosoft.cnmuseum.utils.Status;
import com.sinosoft.cnmuseum.utils.StringUtils;
import com.sinosoft.commontools.annotated.TransAnnotation;
import com.sinosoft.commontools.annotated.rquestMethod;
import com.sinosoft.commontools.annotated.rquestMethod.ReqMode;
import com.sinosoft.commontools.record.Record;

/**  
 * 项目名称：cnmuseum    
 * 类名称：TestServlet    
 * 类描述：    后台例子
 * 创建人：wangli
 * 创建时间：2018年12月21日 下午2:03:22    
 * 修改人：    
 * 修改时间：2018年12月21日 下午2:03:22    
 * 修改备注：    
 * @version     
 * 测试请求：方法限制设置的All,直接在浏览器中访问即可
 *  http://localhost:8080/cnmuseum/testservlet.getData.do?pagenumber=1&pagesize=10
	http://localhost:8080/cnmuseum/testservlet.getDataByWhere.do?pagenumber=1&pagesize=10
	http://localhost:8080/cnmuseum/testservlet.insert.do?xm=wangli&yhmm=wl
	http://localhost:8080/cnmuseum/testservlet.update.do?zdbh=1&xm=wangliwangli&yhmm=wlwl
	http://localhost:8080/cnmuseum/testservlet.delete.do?zdbh=1
 *     
 */
public class TestServlet implements IServlet {
	
	private static Logger logger = Logger.getLogger(TestServlet.class);

	
	/* (non-Javadoc)    普通查询，返回对象
	 * @rquestMethod(MethodNote = ReqMode.Post) 为请求方法，对应WEB-INF下的ServiceConfig.xml
	 * 中services节点下的子节点
	 * 	格式： <service classname="com.sinosoft.cnmuseum.servlets.TestServlet" uri="testservlet"/>
	 * classname为对应类的地址和名称，uri为前端调用接口标识
	 * 调用规则：http://localhost:8080/cnmuseum/testservlet.getData.do
	 * testsrvlet 对应uri
	 * getData 对应类com.sinosoft.cnmuseum.servlets.TestServlet下的方法getData
	 * 
	 * MethodNote = ReqMode.Post 为请求方法限制,仅接受post请求
	 * MethodNote = ReqMode.Get 为请求方法限制,仅接受get请求
	 * MethodNote = ReqMode.All 为请求方法限制,接受post,get等请求
	 * 
	 */
	@Override
	@rquestMethod(MethodNote = ReqMode.All)
	public Record getData(HttpServletRequest request, HttpServletResponse response, Record data) {
		Record result = new Record();
		try {
			MbXtglYhxxDao dao = new MbXtglYhxxDao();
			HashMap<String, Object> map = new HashMap<String, Object>();
			/** 获取前端传的参数，从data中获取，按数据类型获取
			 * 	String 类型使用 data.getStrValue("key")
			 *  int    类型使用 data.getIntValue("key")
			 *  date   类型使用 data.getDateValue("key")
			 *  其他          类型使用 data.getValue("key") 此方法返回的是Object数据
			 */
			// 这里是获取分页参数，可以前端自己定义
			int pagenumber = data.getIntValue(Status.PAGENUMBER);// 获取当前页
			int pagesize = data.getIntValue(Status.PAGESIZE);// 获取每页多少条数据
			// 这里是获取其他查询的参数，由前端定义，后端获取
			String xm = data.getStrValue(MbXtglYhxx.XM);
			String yhmm = data.getStrValue(MbXtglYhxx.YHMM);
			// 使用此种传递Map参数方法，map不能为空，默认传递keyvalue为1和1
			map.put("1", "1");
			// 判断非空，则传递查询参数，map中，第一个字段为数据库字段值，后边为对应值，
			// 注意，此方法传递的参数为等于且and查询,如需要使用like或者or查询，则需要传递sql进行查询
			if(StringUtils.isNoEmpty(xm)){
				map.put(MbXtglYhxx.XM, xm);
			}
			if(StringUtils.isNoEmpty(yhmm)){
				map.put(MbXtglYhxx.YHMM, yhmm);
			}
			/** 查询,返回值说明，json格式的Record对象
			 * total		查询到的总数量
			 * pagenumber	查询页数 
			 * pagetotal	总页数
		 	 * pagesize		每页数量
			 * rows			对应数据 List<Reocrd> 对象
			 */
			// 参数说明map查询条件，pagenumber当前页，pagesize查询数量，MbXtglYhxx.ZDBH排序字段，直接传false
			result = dao.getPageByProperty(map, pagenumber, pagesize, MbXtglYhxx.ZDBH, false);
			// 返回接口调用成功标识
			result.add(Status.SATUS,Status.OK);
		} catch (Exception e) {
			// 返回接口调用失败标识
			result.add(Status.SATUS,Status.FAILED);
			// 返回接口调用失败信息，需要自己添加
			result.add(Status.MSG,"查询失败！");
		}
		// 接口返回Record对象，框架会自动封装返回给请求result对象中的数据
	    return result;
	}
	
	@rquestMethod(MethodNote = ReqMode.All)
	public Record getDataByWhere(HttpServletRequest request, HttpServletResponse response, Record data) {
		Record result = new Record();
		try {
			MbXtglYhxxDao dao = new MbXtglYhxxDao();
			String countsql = "select count(zdbh) as count from "+MbXtglYhxx.MB_XTGL_YHXX_TABLE_NAME+" where 1=1 ";
			String sql = "select * from "+MbXtglYhxx.MB_XTGL_YHXX_TABLE_NAME+" where 1=1 ";
			String ordersql = " order by zdbh desc ";
			String limitsql = " limit ";
			/** 获取前端传的参数，从data中获取，按数据类型获取
			 * 	String 类型使用 data.getStrValue("key")
			 *  int    类型使用 data.getIntValue("key")
			 *  date   类型使用 data.getDateValue("key")
			 *  其他          类型使用 data.getValue("key") 此方法返回的是Object数据
			 */
			// 这里是获取分页参数，可以前端自己定义
			int pagenumber = data.getIntValue(Status.PAGENUMBER);// 获取当前页
			int pagesize = data.getIntValue(Status.PAGESIZE);// 获取每页多少条数据
			// 这里是获取其他查询的参数，由前端定义，后端获取
			String xm = data.getStrValue(MbXtglYhxx.XM);
			String yhmm = data.getStrValue(MbXtglYhxx.YHMM);
			// 判断非空，则传递查询参数，map中，第一个字段为数据库字段值，后边为对应值，
			// 注意，此方法传递的参数为等于且and查询,如需要使用like或者or查询，则需要传递sql进行查询
			if(StringUtils.isNoEmpty(xm)){
				countsql += " and "+MbXtglYhxx.XM+" = '"+xm;
				sql += " and "+MbXtglYhxx.XM+" = '"+xm;
			}
			if(StringUtils.isNoEmpty(yhmm)){
				countsql += " and "+MbXtglYhxx.YHMM+" = '"+yhmm;
				sql += " and "+MbXtglYhxx.YHMM+" = '"+yhmm;
			}
			/** 查询,返回值说明，json格式的List<Record>对象
			 */
			List<Record> countlist = dao.getBySql(countsql);
			int total = countlist.get(0).getIntValue("count");
			PageUtil page = new PageUtil(pagenumber, pagesize, total);
			limitsql += page.getStart()+","+pagesize;
			List<Record> list = dao.getBySql(sql+ordersql+limitsql);
			// 组装数据
			result.add(Status.ROWS, list);
			result.add(Status.TOTAL, total);
			result.add(Status.PAGENUMBER, pagenumber);
			result.add(Status.PAGESIZE, pagesize);
			result.add(Status.PAGETOTAL, page.getPagetotal());
			// 返回接口调用成功标识
			result.add(Status.SATUS,Status.OK);
		} catch (Exception e) {
			// 返回接口调用失败标识
			result.add(Status.SATUS,Status.FAILED);
			// 返回接口调用失败信息，需要自己添加
			result.add(Status.MSG,"查询失败！");
		}
		// 接口返回Record对象，框架会自动封装返回给请求result对象中的数据
	    return result;
	}

	
	/* (non-Javadoc)    
	 * @TransAnnotation(isTrans=true) 是否开启事物的注解，在插入更新删除操作时需要这个注解    
	 */
	@Override
	@rquestMethod(MethodNote = ReqMode.All)
	@TransAnnotation(isTrans=true)
	public Record insert(HttpServletRequest request, HttpServletResponse response, Record data) {
		Record result = new Record();
		try{
			MbXtglYhxxDao dao = new MbXtglYhxxDao();
			Record yhxx = new Record();
			String xm = data.getStrValue(MbXtglYhxx.XM);
			String yhmm = data.getStrValue(MbXtglYhxx.YHMM);
			if(StringUtils.isNoEmpty(xm)){
				yhxx.add(MbXtglYhxx.XM, xm);
			}
			if(StringUtils.isNoEmpty(yhmm)){
				yhxx.add(MbXtglYhxx.YHMM, yhmm);
			}
			if(dao.insert(yhxx)){
				int zdbh = yhxx.getIntValue(MbXtglYhxx.ZDBH);
				// 事务模式下，此标识将使此次事务提交
				result.add(Status.SATUS,Status.OK);
			}else{
				throw new Exception("插入信息失败！");
			}
		} catch (Exception e) {
			logger.error(e.getMessage());
			e.printStackTrace();
			// 事务回滚，事务模式下，此标识将使此次事务回滚
			result.add(Status.SATUS, Status.FAILED);
		}
	    return result;
	}
	
	
	
	@Override
	@rquestMethod(MethodNote = ReqMode.All)
	@TransAnnotation(isTrans=true)
	public Record update(HttpServletRequest request, HttpServletResponse response, Record data) {
		Record result = new Record();
		try {
			MbXtglYhxxDao dao = new MbXtglYhxxDao();
			Record yhxx = dao.getById(data.getIntValue("zdbh"));
			if(yhxx!=null){
				String xm = data.getStrValue(MbXtglYhxx.XM);
				String yhmm = data.getStrValue(MbXtglYhxx.YHMM);
				if(StringUtils.isNoEmpty(xm)){
					yhxx.add(MbXtglYhxx.XM, xm);
				}
				if(StringUtils.isNoEmpty(yhmm)){
					yhxx.add(MbXtglYhxx.YHMM, yhmm);
				}
				if(dao.update(yhxx)){
					int zdbh = yhxx.getIntValue(MbXtglYhxx.ZDBH);
					// 事务模式下，此标识将使此次事务提交
					result.add(Status.SATUS,Status.OK);
				}else{
					throw new Exception("更新信息失败！");
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			logger.error(e.getMessage());
			result.add(Status.SATUS, Status.FAILED);
		}
	    return result;
	}
	
	@Override
	@rquestMethod(MethodNote = ReqMode.All)
	public Record delete(HttpServletRequest request, HttpServletResponse response, Record data) {
		Record result = new Record();
		try {
			MbXtglYhxxDao dao = new MbXtglYhxxDao();
			Record yhxx = dao.getById(data.getIntValue("zdbh"));
			if(yhxx!=null){
				if(dao.delete(yhxx)){
					// 事务模式下，此标识将使此次事务提交
					result.add(Status.SATUS,Status.OK);
				}else{
					throw new Exception("删除信息失败！");
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			logger.error(e.getMessage());
			// 事务回滚
			result.add(Status.SATUS, Status.FAILED);
		}
	    return result;
	}
	
}
